Skip to content
JM Lee edited this page Jul 7, 2023 · 4 revisions

✔️ 상세페이지

  • 게시글과 게시글에 딸린 댓글, 대댓글을 보여주는 페이지
  • 수정과 삭제 버튼을 통해 게시글을 수정, 삭제할 수 있다.
  • 게시글이 삭제되면 댓글과 대댓글도 같이 삭제된다.
  • 재료가 적혀있을 시, 재료에 쿠팡 링크도 같이 나타난다.

💻 code

articles/views.py(게시글 RUD)
class ArticleDetailView(APIView):
    def get(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        serializer = ArticleDetailSerializer(
            article,
            context={"request": request},
        )
        return Response(serializer.data)

    def put(self, request, article_id):
        art_put = get_object_or_404(Article, id=article_id)
        if request.user == art_put.author:
            serializer = ArticleSerializer(
                art_put, data=request.data, context={"request": request}
            )
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, article_id):
        art_del = get_object_or_404(Article, id=article_id)
        if request.user == art_del.author:
            art_del.delete()
            return Response(
                {"message": "게시글이 삭제되었습니다"}, status=status.HTTP_204_NO_CONTENT
            )
        return Response(
            {"error": "본인이 작성한 게시글만 삭제할수 있습니다"}, status=status.HTTP_403_FORBIDDEN
        )
views.py(재료RUD)
class IngredientDetailView(APIView):
    def get(self, request):
        ingredient = get_object_or_404(Ingredient, id=id)
        serialize = IngredientSerializer(ingredient)
        return Response(serialize.data, status=status.HTTP_200_OK)

    def put(self, request, article_id):
        ing_put = get_object_or_404(Ingredient, id=article_id)
        if request.user == ing_put.user:
            serializer = IngredientSerializer(ing_put, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, article_id):
        ing_del = get_object_or_404(Article, id=article_id)
        if request.user == ing_del.user:
            ing_del.delete()
            return Response(
                {"message": "재료가 삭제되었습니다"}, status=status.HTTP_204_NO_CONTENT
            )
        return Response(
            {"error": "본인이 작성한 재료만 삭제할수 있습니다"}, status=status.HTTP_403_FORBIDDEN
        )
views.py(댓글RUD)
class CommentView(generics.ListCreateAPIView):
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    pagination_class = CommentPagination
    serializer_class = CommentSerializer
    queryset = None

    def get_queryset(self):
        queryset = Comment.objects.filter(article_id=self.article_id)
        order = self.request.GET.get("order", None)
        if order == "1":
            return queryset.order_by("-like_count")
        if order == "2":
            return queryset.order_by("created_at")
        return queryset.order_by("-created_at")

    def get(self, request, *args, **kwargs):
        self.article_id = kwargs.get("article_id")
        return super().get(request, *args, **kwargs)

class CommentDetailView(APIView):
    def put(self, request, article_id, comment_id):
        comment = get_object_or_404(Comment, id=comment_id)
        if request.user == comment.author:
            serializer = CommentSerializer(
                comment, data=request.data, context={"request": request}
            )
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        return Response(
            {"error": "본인이 작성한 댓글만 수정할수 있습니다"}, status=status.HTTP_403_FORBIDDEN
        )

    def delete(self, request, article_id, comment_id):
        comment = get_object_or_404(Comment, id=comment_id)
        if request.user == comment.author:
            comment.delete()
            return Response("댓글이 삭제되었습니다", status=status.HTTP_204_NO_CONTENT)
        return Response("본인이 작성한 댓글만 삭제할수 있습니다", status=status.HTTP_403_FORBIDDEN)
views.py(대댓글RUD)
class RecommentView(generics.ListCreateAPIView):
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    pagination_class = ReCommentPagination
    serializer_class = RecommentSerializer
    queryset = None

    def get_queryset(self):
        queryset = Recomment.objects.filter(
            article_id=self.article_id, comment_id=self.comment_id
        )
        order = self.request.GET.get("order", None)
        if order == "1":
            return queryset.order_by("-like_count")
        if order == "2":
            return queryset.order_by("created_at")
        return queryset.order_by("-created_at")

    def get(self, request, *args, **kwargs):
        self.article_id = kwargs.get("article_id")
        self.comment_id = kwargs.get("comment_id")
        return super().get(request, *args, **kwargs)

class RecommentDetailView(APIView):
    def put(self, request, article_id, comment_id, recomment_id):
        recomment = get_object_or_404(Recomment, id=recomment_id)
        if request.user == recomment.author:
            serializer = RecommentSerializer(
                recomment, data=request.data, context={"request": request}
            )
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        return Response(
            {"error": "본인이 작성한 대댓글만 수정할수 있습니다"}, status=status.HTTP_403_FORBIDDEN
        )

    def delete(self, request, article_id, comment_id, recomment_id):
        recomment = get_object_or_404(Recomment, id=recomment_id)
        if request.user == recomment.author:
            recomment.delete()
            return Response(
                {"message": "대댓글이 삭제되었습니다"}, status=status.HTTP_204_NO_CONTENT
            )
        return Response(
            {"error": "본인이 작성한 댓글만 삭제할수 있습니다"}, status=status.HTTP_403_FORBIDDEN
        )
views.py(게시글, 댓글, 대댓글 좋아요)
class ArticleLikeView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def post(self, request, article_id):
        """게시글 좋아요 누르기"""
        article = get_object_or_404(Article, id=article_id)
        if request.user in article.like.all():
            article.like.remove(request.user)
            return Response("dislike", status=status.HTTP_200_OK)
        else:
            article.like.add(request.user)
            return Response("like", status=status.HTTP_200_OK)


class CommentLikeView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def post(self, request, comment_id):
        """댓글 좋아요 누르기"""
        comment = get_object_or_404(Comment, id=comment_id)
        if request.user in comment.like.all():
            comment.like.remove(request.user)
            return Response("dislike", status=status.HTTP_200_OK)
        else:
            comment.like.add(request.user)
            return Response("like", status=status.HTTP_200_OK)


class ReCommentLikeView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def post(self, request, recomment_id):
        """댓글 좋아요 누르기"""
        recomment = get_object_or_404(Recomment, id=recomment_id)
        if request.user in recomment.like.all():
            recomment.like.remove(request.user)
            return Response("dislike", status=status.HTTP_200_OK)
        else:
            recomment.like.add(request.user)
            return Response("like", status=status.HTTP_200_OK)

📷 View
Image
Clone this wiki locally